<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

<script>

// 浏览器的JS引擎，主要负责解析并执行JS代码

// 在JS中变量声明或函数声明时，代码解析的时候'声明'会提升到当前作用域顶部

var a = 1;
function test(){
    console.log( a );// undefined
    var a = 2;
    console.log( a );// 2
}
test();

// 伪代码：模拟解析之后的代码
// var a;// 变量声明提升
// function test(){// 函数声明提升
//     var a;// 变量声明提升
//     console.log( a );// undefined
//     a = 2;
//     console.log( a );// 2
// }
// a = 1;
// test();// 先解析再执行函数内部的代码


// fn1();
// 函数声明
function fn1(){
    console.log( '函数声明' );
}


// fn2();// 报错
// 函数表达式
var fn2 = function (){
    console.log( '函数表达式' );
}
// fn2();


console.log( typeof fn );// 'function'
var fn = 10;
function fn(){}
console.log( typeof fn );// 'number'

/* // 伪代码：
// 变量和函数重名时，函数优先使用该名字
// var fn;
function fn(){}
console.log( typeof fn );// 'function'
fn = 10;
console.log( typeof fn );// 'number' */


 console.log( a );
var a = 1;
function a(){
    console.log( 2 );
}
console.log( a );
var a = 3;
console.log( a );
function a(){
    console.log( 3 );
}
console.log( a ); 

/* // 伪代码：
// var a;
function a(){
    console.log( 3 )
}
// var a;

console.log( a );// function a(){}
a = 1;
console.log( a );// 1
a = 3;
console.log( a );// 3
console.log( a );// 3 */


console.log( a );// undefined
var a = 1;

console.log( b );// 报错
b = 2;


var a = 1;
function fn(){
    console.log( a );// 1
    a = 2;// 修改全局变量的值
}
fn();
console.log( a );// 2


var a = 1;
function fn(a){
    console.log( a );// undefined
    a = 2;// 修改形参的值
       console.log( a );//2
}
fn();
console.log( a );// 1


var a = 1;
function fn(a){
    console.log( a );// 1
    a = 2;// 修改形参的值
    console.log( a );//2
}
fn(a);
console.log( a );// 1

</script>
</body>
</html>